import java.util.ArrayList;
import java.util.List;

/**
 * 给你一个长度固定的整数数组arr，请你将该数组中出现的每个零都复写一遍，并将其余的元素向右平移。
 * 注意：请不要在超过该数组长度的位置写入元素。
 * 要求：请对输入的数组就地进行上述修改，不要从函数返回任何东西。
 * <p>
 * 示例 1：
 * 输入：[1,0,2,3,0,4,5,0]
 * 输出：null
 * 解释：调用函数后，输入的数组将被修改为：[1,0,0,2,3,0,0,4]
 * <p>
 * 示例 2：
 * 输入：[1,2,3]
 * 输出：null
 * 解释：调用函数后，输入的数组将被修改为：[1,2,3]
 * <p>
 * 提示：
 * 1 <= arr.length <= 10000
 * 0 <= arr[i] <= 9
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/duplicate-zeros
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Q01089s {
    public void duplicateZeros(int[] arr) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == 0) {
                list.add(i); // 0的位置加入到list
            }
        }
        list.add(arr.length - 1); // 为了特殊处理只有1个0的情况
        int end = list.get(list.size() - 1);
        int i = list.size() - 2;
        while (i >= 0) {
            int start = list.get(i);
            for (int j = Math.min(end, arr.length - i - 2); j > start; j--) { // min是为了确保不越界
                arr[j + i + 1] = arr[j]; // 移动前面0的个数作为偏移量的位置
            }
            if (start + i < arr.length) {
                arr[start + i] = 0;
            }
            if (start + i + 1 < arr.length) {
                arr[start + i + 1] = 0;
            }
            end = start;
            i--;
        }
    }
}
